package com.metis.document.parse.dialog.utils.chaos;

import com.github.houbb.opencc4j.util.ZhConverterUtil;
import com.metis.document.parse.dialog.utils.ikseg.IkUtils;
import com.metis.document.parse.dialog.utils.ikseg.core.Lexeme;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.List;
import java.util.Properties;

/**
 * 通过ik分词之后，单字的比例来判断某个文本是否乱码、或是不可读的文本段
 */
@Slf4j
public class ChaosFileUtils {

    public static boolean isChaosFile(String textSrc) {
        long startTime = System.currentTimeMillis();
        // 使用replaceAll去掉所有空格
        String text = textSrc.replaceAll("\\s", "");

        String target = ZhConverterUtil.convertToSimple(text);
        Properties props = new Properties();
        props.setProperty("enable_lowercase", "false");
        props.setProperty("use_smart", "true");

        List<Lexeme> lexemes = null;
        try {
            lexemes = IkUtils.ikParse(text, props);
        } catch (IOException e) {
            e.printStackTrace();
        }
        double lexemeCharCount = 0;
        double oneCharLexemeCount = 0;
        for (Lexeme lexeme : lexemes) {
           //log.info(lexeme.toString());
            lexemeCharCount += lexeme.getLength();
            if (lexeme.getLength() == 1) {
                oneCharLexemeCount++;
            }
        }

        boolean result =
                //单字符的词占比
                oneCharLexemeCount / lexemes.size() > 0.9
                        //有意义的词占全文的比例
                        || lexemeCharCount / target.length() < 0.1;
        log.info("isChaosFile: {}, lexemes.size: {}, oneCharLexemeCount: {}", result, lexemes.size(), oneCharLexemeCount);
        log.info("通过ik分词过滤乱码耗时:{}ms", System.currentTimeMillis() - startTime);
        return result;
    }
}
